package game.mechanics;

import game.enums.EquipSlots;
import game.referenceValues.Feat;
import game.units.Attribute;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Inventory {
	
	private ArrayList<Attribute> bonuses;
	private Map<EquipSlots, Equip> equipment;
	private ArrayList<Item> spareItems;
	private ArrayList<Item> itens;
	private int capacity;
	private int currentWeight;
	
// Estou com duvidas e mexendo aqui, depois conversamos!
	public Inventory(int capacity)
	{
		bonuses = new ArrayList<Attribute>();
		spareItems = new ArrayList<Item>();
		itens = new ArrayList<Item>();
		
		ArrayList<EquipSlots> slots = new ArrayList<EquipSlots>();
		slots.add(EquipSlots.Head);
		ArrayList<EquipSlots> slots1 = new ArrayList<EquipSlots>();
		slots1.add(EquipSlots.Neck);
		ArrayList<EquipSlots> slots2 = new ArrayList<EquipSlots>();
		slots2.add(EquipSlots.Body);
		ArrayList<EquipSlots> slots3 = new ArrayList<EquipSlots>();
		slots3.add(EquipSlots.Shoulder);
		ArrayList<EquipSlots> slots4 = new ArrayList<EquipSlots>();
		slots4.add(EquipSlots.MainHand);
		ArrayList<EquipSlots> slots5 = new ArrayList<EquipSlots>();
		slots5.add(EquipSlots.OffHand);
		ArrayList<EquipSlots> slots6 = new ArrayList<EquipSlots>();
		slots6.add(EquipSlots.Hands);
		ArrayList<EquipSlots> slots7 = new ArrayList<EquipSlots>();
		slots7.add(EquipSlots.RightFinger);
		ArrayList<EquipSlots> slots8 = new ArrayList<EquipSlots>();
		slots8.add(EquipSlots.LeftFinger);
		ArrayList<EquipSlots> slots9 = new ArrayList<EquipSlots>();
		slots9.add(EquipSlots.Waist);
		ArrayList<EquipSlots> slots10 = new ArrayList<EquipSlots>();
		slots10.add(EquipSlots.Foot);
		
		// inicializando slots vazios para equips
		equipment = new HashMap<EquipSlots, Equip>();
		
		equipment.put(EquipSlots.Head, new Equip("empty slot", " ", 0, slots, null, 0, null, 0, 0));		
		equipment.put(EquipSlots.Neck, new Equip("empty slot", " ", 0, slots1, null, 0, null, 0, 0));		
		equipment.put(EquipSlots.Body, new Equip("empty slot", " ", 0, slots2, null, 0, null, 0, 0));
		equipment.put(EquipSlots.Shoulder, new Equip("empty slot", " ", 0, slots3, null, 0, null, 0, 0));
		equipment.put(EquipSlots.MainHand, new Equip("empty slot", " ", 0, slots4, null, 0, null, 0, 0));
		equipment.put(EquipSlots.OffHand, new Equip("empty slot", " ", 0, slots5, null, 0, null, 0, 0));
		equipment.put(EquipSlots.Hands, new Equip("empty slot", " ", 0, slots6, null, 0, null, 0, 0));
		equipment.put(EquipSlots.RightFinger, new Equip("empty slot", " ", 0, slots7, null, 0, null, 0, 0));
		equipment.put(EquipSlots.LeftFinger, new Equip("empty slot", " ", 0, slots8, null, 0, null, 0, 0));
		equipment.put(EquipSlots.Waist, new Equip("empty slot", " ", 0, slots9, null, 0, null, 0, 0));
		equipment.put(EquipSlots.Foot, new Equip("empty slot", " ", 0, slots10, null, 0, null, 0, 0));
		currentWeight = 0;
		this.capacity= capacity;
	}

	public boolean evaluateRequirements(Equip toEquip, ArrayList<Feat> charFeats)
	{
		int count = 0;
		for (Feat feat : toEquip.getRequirements()) {
			for (Feat cfeat : charFeats) {
				if(feat.getName().equals(cfeat.getName()));
					count++;
			}
		}
		if(count ==  toEquip.getRequirements().size())
		{
			return true; 
		}
		else
		{
			return false;
		}		
	}
	
	public void removeEquipment(EquipSlots toRemove)
	{
		ArrayList<EquipSlots> slots = new ArrayList<EquipSlots>();
		slots.add(EquipSlots.Head);
		equipment.put(EquipSlots.Head, new Equip("empty slot", " ", 0, slots, null, 0, null, 0, 0));
	}
	
	
	public void equip(Equip toEquip, ArrayList<Feat> charFeats, EquipSlots slot)
	{
		if(evaluateRequirements(toEquip, charFeats))
		{
			equipment.put(slot, toEquip);
		}		
	}
	
	public boolean pickUp(Item item)
	{
		if((capacity - (currentWeight + item.getWeight())) >= 0)
		{
			itens.add(item);
			return true;
		}
		else
		{
			return false;
		}
	}

	public ArrayList<Attribute> getBonuses() {
		return bonuses;
	}

	public void setBonuses(ArrayList<Attribute> bonuses) {
		this.bonuses = bonuses;
	}

	public Equip getEquip(EquipSlots slot) {
		return equipment.get(slot);
	}

	public ArrayList<Item> getItens() {
		return itens;
	}

	public void setItens(ArrayList<Item> itens) {
		this.itens = itens;
	}
	
	public void pickUpItem(Item item)
	{
		itens.add(item);
	}
			
		
	
}
